

// 1. 使用泛型  generic  /dʒəˈnerɪk/   翻译：未贴牌的商品
// ts 最重要的事情 - 批注
// 泛型指的是在定义的时候，不方便加批注，但是形式上得有

// 以前的写法
// function fn(x: number, y: number): number {
//     return x + y;
// }

// 如果使用泛型，函数的返回值就不能确定了
// function fn(x: ?, y: ?): void {
function fn<T>(x: T, y: T): any {
    // 业务在进行设计的时候，需要接收的是未知的参数
    // 但是在执行的时候，需要满足不报错误的情况
    return `${x}, ${y}`;
}

// console.log(fn<number>(20, 21));
// console.log(fn<number>('20', 21));


// 案例1：封装一个可以生成指定次数、指定内容的数组
// function createArr(val: string, count: number): any[] {
//     // let arr: string[];
//     let arr: Array<string>;
//     arr = []

//     // 生成数组
//     for(let i: number = 0; i < count; i++) {
//         arr.push(val);
//     }

//     return arr;
// }

// let nameArr = createArr('迪丽热巴', 5);
// // console.log(nameArr);
// // console.log(nameArr[0].slice(2, 8));
// // 如果返回值的类型没有限制住，则这里也会报错
// console.log(nameArr[0].toFixed(2));


// 使用泛型改造
function createArr<D>(val: D, count: number): D[] {
    // let arr: string[];
    let arr: Array<D>;
    arr = []

    // 生成数组
    for(let i: number = 0; i < count; i++) {
        arr.push(val);
    }

    return arr;
}

// let nameArr = createArr<boolean>(true, 5);
let nameArr: string[] = createArr<string>('爱新觉罗溥仪', 5);
// let nameArr: number[] = createArr<number>(200.4543, 5);
// console.log(nameArr);
console.log(nameArr[0].slice(2, 8));
// 如果返回值的类型没有限制住，则这里也会报错
// console.log(nameArr[0].toFixed(2));

/*
    好处，
        在定义方法的时候，能够把方法写的更加灵活
        让调用的时候，传入不同的实际类型，进行区分，能够更早处理错误
*/




